package modelo.dao.impl;

import java.sql.*;
import java.util.*;
import modelo.dao.inter.IContatoDAO;
import modelo.dto.*;

public class ContatoImpl extends GenericoImpl implements IContatoDAO {

	public ContatoImpl(Connection conn) {
		super(conn);
	}

    @Override
    public boolean cadastrar(Object obj) throws SQLException {
    	Contato contato = (Contato) obj;
        
        super.sql = "INSERT INTO contato(nome, sobrenome, sexo, comentario, email, fk_grupo) VALUES(?,?,?,?,?,?)";             
        
        //char sex = 'k';
        //Character.toString(sex); // converte um char em uma String
        
        try {
        	super.pstm = super.conn.prepareStatement(super.sql);
            super.pstm.setString(1, contato.getNome());
            super.pstm.setString(2, contato.getSobreNome());
            super.pstm.setString(3, contato.getSexo());            
            super.pstm.setString(4, contato.getComentario());
            super.pstm.setString(5, contato.getEmail().getEnderecoEmail());
            super.pstm.setInt(6, contato.getGrupo().getCodigo());
            
            super.efetuou = !super.pstm.execute();
            
            super.conn.commit();
		}
        catch (SQLException e) {
        	super.conn.rollback();
        	e.printStackTrace();
        	System.out.println("Erro ao tentar cadastrar contato - "+e.getMessage());        	       
		}

        return super.efetuou;
    }

    @Override
    public boolean atualizar(Object obj) throws SQLException {
        Contato contato = (Contato) obj;
        
        super.sql = "UPDATE contato SET nome= ?, sobrenome=?, sexo= ?, comentario= ?, email= ?, fk_grupo= ? WHERE id_contato= ?";
        
        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);
            super.pstm.setString(1, contato.getNome());
            super.pstm.setString(2, contato.getSobreNome());
            super.pstm.setString(3, contato.getSexo());
            super.pstm.setString(4, contato.getComentario());
            super.pstm.setString(5, contato.getEmail().getEnderecoEmail());
            super.pstm.setInt(6, contato.getGrupo().getCodigo());
            super.pstm.setInt(7, contato.getCodigo());
            
            System.out.println(super.pstm.toString());
            
            super.efetuou = !super.pstm.execute();
            
            super.pstm.getConnection().commit();
        }
        catch (SQLException e) {
        	e.printStackTrace();
        	super.pstm.getConnection().rollback();
            System.out.println("Erro: "+e.getMessage());
        }
        
        return super.efetuou;
    }

    @Override
    public boolean excluir(Object obj) throws SQLException {
    	Contato contato = (Contato) obj;
        
        super.sql = "DELETE FROM contato WHERE id_contato= ?";
        
        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);
            super.pstm.setInt(1, contato.getCodigo());
            
            super.efetuou = !super.pstm.execute();
            
            super.pstm.getConnection().commit();
        } 
        catch (SQLException e) {
        	e.printStackTrace();
        	super.pstm.getConnection().rollback();        	
            System.out.println("Erro: "+e.getMessage());
        }
        
        return super.efetuou;
    }

    @Override
    public List<Contato> buscarTodos() throws SQLException {        
        List<Contato> listContatos = new ArrayList<Contato>();
        Contato contato = null;
        Email email = null;
        Grupo grupo = null;
        
        super.sql = "SELECT * FROM contato ORDER BY nome, sobrenome";
        
        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);            
            super.res = super.pstm.executeQuery();
            
            super.pstm.getConnection().commit();
            
            while(super.res.next()) {
                contato = new Contato();
                email = new Email();
                grupo = new Grupo();
                
                contato.setCodigo(super.res.getInt("id_contato"));
                contato.setNome(super.res.getString("nome"));
                contato.setSobreNome(super.res.getString("sobrenome"));
                contato.setSexo(super.res.getString("sexo"));
                contato.setComentario(super.res.getString("comentario"));
                
                email.setEnderecoEmail(super.res.getString("email"));
                contato.setEmail(email);
                
                grupo.setCodigo(super.res.getInt("fk_grupo"));
                contato.setGrupo(grupo);
                
                listContatos.add(contato);                                               
            }            
        } 
        catch (SQLException e) {
        	e.printStackTrace();
        	super.pstm.getConnection().rollback();
            System.out.println("Erro: "+e.getMessage());
        }
        
        return listContatos;
    }

    @Override
    public Contato getObjetoById(Object obj) throws SQLException {
        Contato contato = (Contato) obj;
        Email email = null;
        Grupo grupo = null;
        
        super.sql = "SELECT * FROM contato WHERE id_contato= ? ORDER BY nome, sobrenome";
        
        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);            
            super.pstm.setInt(1, contato.getCodigo());
            
            super.res = super.pstm.executeQuery();
            
            super.pstm.getConnection().commit();
            
            if(super.res.next()){
                email = new Email();
                grupo = new Grupo();
                
                contato.setCodigo(super.res.getInt("id_contato"));
                contato.setNome(super.res.getString("nome"));
                contato.setSobreNome(super.res.getString("sobrenome"));
                contato.setSexo(super.res.getString("sexo"));
                contato.setComentario(super.res.getString("comentario"));
                
                email.setEnderecoEmail(super.res.getString("email"));
                contato.setEmail(email);
                
                grupo.setCodigo(super.res.getInt("fk_grupo"));
                contato.setGrupo(grupo);                                                              
            }            
            
        } 
        catch (SQLException e) {
        	super.pstm.getConnection().rollback();
            System.out.println("Erro: "+e.getMessage());
        }
        
        return contato;
    }

    
	@Override
	public List<Contato> buscarByNome(Contato contato) throws SQLException {
		List<Contato> listContatos = new ArrayList<Contato>();		
		
        Email email = null;
        Grupo grupo = null;
                       
        super.sql = "SELECT * FROM vw_contato_grupo WHERE nome LIKE ? ORDER BY nome, sobrenome";
        
        try {
            super.pstm = super.conn.prepareStatement(super.sql);
            super.pstm.setString(1, contato.getNome()+"%");
            
            System.out.printf("\n%s",super.pstm.toString());
            
            super.res = super.pstm.executeQuery();
            
            super.pstm.getConnection().commit();
            
            while(super.res.next()) {
                email = new Email();
                grupo = new Grupo();
                
                contato = new Contato();
                contato.setCodigo(super.res.getInt("id_contato"));
                contato.setNome(super.res.getString("nome"));
                contato.setSobreNome(super.res.getString("sobrenome"));                                              
                contato.setSexo(super.res.getString("sexo"));
                contato.setComentario(super.res.getString("comentario"));
                
                email.setEnderecoEmail(super.res.getString("email"));
                contato.setEmail(email);
                
                grupo.setCodigo(super.res.getInt("fk_grupo"));
                grupo.setNomeGrupo(super.res.getString("nome_grupo"));
                contato.setGrupo(grupo);
                
                listContatos.add(contato);                                               
            }            
        }        
        catch (SQLException e) {
        	e.printStackTrace();
        	super.pstm.getConnection().rollback();
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
        return listContatos;
	}    
    
	@Override
	public Contato buscarByGrupoAndTelefoneAndOperadora(Contato contato) throws SQLException {
        Operadora operadora = null;
        Contato cont = null;               
        Telefone telefone = null;
        
        super.sql = "SELECT * FROM cont_grup_tel_oper WHERE id_contato = ?";

        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);            
            super.pstm.setInt(1, contato.getCodigo());
            
            System.out.println(super.pstm.toString());
            
            super.res = super.pstm.executeQuery();
            
            super.conn.commit();
            
            if(super.res.next()) {
            	
           		cont = new Contato();            	            
            	cont.setCodigo(super.res.getInt("id_contato"));
            	cont.setNome(super.res.getString("nome"));
            	cont.setSobreNome(super.res.getString("sobrenome"));
            	cont.setSexo(super.res.getString("sexo"));
            	cont.setComentario(super.res.getString("comentario"));            	
            	cont.getEmail().setEnderecoEmail(super.res.getString("email"));
                cont.getGrupo().setCodigo(super.res.getInt("id_grupo"));
                cont.getGrupo().setNomeGrupo(super.res.getString("nome_grupo"));

                operadora = new Operadora();
                operadora.setCodigo(super.res.getInt("id_operadora"));
                operadora.setNomeOperadora(super.res.getString("descricao"));
                
                telefone = new Telefone();
                telefone.setCodigo(super.res.getInt("id_telefone"));
                telefone.setNumero(super.res.getString("numero"));
                              
                telefone.setOperadora(operadora);
                
                cont.adicionarTelefone(telefone);                
            	
                while(super.res.next()){
                    telefone = new Telefone();
                    telefone.setCodigo(super.res.getInt("id_telefone"));
                    telefone.setNumero(super.res.getString("numero"));                   
                    
                    operadora = new Operadora();
                    operadora.setCodigo(super.res.getInt("id_operadora"));
                    operadora.setNomeOperadora(super.res.getString("descricao"));
                    
                    telefone.setOperadora(operadora);                    
                    
                    cont.adicionarTelefone(telefone);
                }
                                              
            }
            
        }
        catch (SQLException e) {
        	super.conn.rollback();
        	e.printStackTrace();
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
        return cont;
	}

	@Override
	public Contato getUltimoObjeto() throws SQLException {
		Contato contato = null;
		
        super.sql = "SELECT * FROM contato";
        
        try {
            super.pstm = super.conn.prepareStatement(super.sql);
            super.res = super.pstm.executeQuery();
                                                     
            //super.pstm.getConnection().commit();
            
            if(super.res.last()) {
                contato = new Contato();
                contato.setCodigo(super.res.getInt("id_contato"));                                                            
                contato.setNome(super.res.getString("nome"));
            }
            
            super.pstm.getConnection().commit();
        }
        catch (SQLException e) {
        	super.pstm.getConnection().rollback();
        	e.printStackTrace();
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
		return contato;
	}

	@Override
	public List<Contato> buscaAvancada(Contato contato) throws SQLException {
		List<Contato> listContatos = new ArrayList<Contato>();		
		
        Email email = null;
        Grupo grupo = null;
                       
        super.sql = "SELECT * FROM vw_contato_grupo as vw WHERE vw.nome LIKE ? AND (vw.sexo = ? AND vw.id_grupo = ?)";
        
        try {
            super.pstm = super.conn.prepareStatement(super.sql);
            super.pstm.setString(1, contato.getNome()+"%");
            super.pstm.setString(2, contato.getSexo());
            super.pstm.setObject(3, contato.getGrupo().getCodigo());
            
            System.out.printf("\n%s",super.pstm.toString());
            
            super.res = super.pstm.executeQuery();
            
            super.pstm.getConnection().commit();
            
            while(super.res.next()) {
                email = new Email();
                grupo = new Grupo();
                
                contato = new Contato();
                contato.setCodigo(super.res.getInt("id_contato"));
                contato.setNome(super.res.getString("nome"));
                contato.setSobreNome(super.res.getString("sobrenome"));
                contato.setSexo(super.res.getString("sexo"));
                contato.setComentario(super.res.getString("comentario"));
                
                email.setEnderecoEmail(super.res.getString("email"));
                contato.setEmail(email);
                
                grupo.setCodigo(super.res.getInt("fk_grupo"));
                grupo.setNomeGrupo(super.res.getString("nome_grupo"));
                contato.setGrupo(grupo);
                
                listContatos.add(contato);                                               
            }            
        }        
        catch (SQLException e) {
        	e.printStackTrace();
        	super.pstm.getConnection().rollback();
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
        return listContatos;	    
	}    


}


